【デジタルツイン×生成AIによる製造業DX!】AWS IoT TwinMaker Samples のクッキー工場バージョン3(CookieFactoryV3)を試してみた 〜その3 AI アシスタント設定編〜
(2024/11/05 一部追記)
こんにちは、CX 事業本部製造ビジネステクノロジー部の若槻です。
ここまでのエントリでは、AWS IoT TwinMaker Samples の CookieFactoryV3 の環境構築とダッシュボード操作確認を行いました。
上記の実装だけでも AWS IoT TwinMaker のデモとしては十分な内容なのですが、今回はここまでの実装に対して下記の公式ブログで紹介されている、Amazon Bedrock を利用した AI アシスタントを設定するチュートリアルを試してみます。
設定イメージ(上記ブログより引用)としては、次のように Amazon Bedrock 上のモデルを利用した「Cookie Factory AI Assitant Module」をローカルで構成し、ユーザーのプロンプト入力、ダッシュボード上の表示および Amazon S3 上の設備マニュアルをコンテキストデータとしてチャット UI で応答を行うというものです。
ちなみに今回行うのは AI アシスタントの設定のみで、詳細な仕様理解は別の記事で行う予定です。
試してみた
実際に Cookie Factory AI Assitant Module を実装して AI アシスタントを設定してみます。基本的には前述の公式ブログ内の手順に則れば良いのですが、Cloud9 環境上だと Vite で起動したアプリケーションにアクセスできない問題 が発生していたので、ローカルで確認した手順を記載します。
リポジトリのクローン
まだの場合は、AWS IoT TwinMaker Samples のリポジトリをローカルにクローンし、プロジェクトルートに移動します。
git clone https://github.com/aws-samples/aws-iot-twinmaker-samples.git
cd aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3
環境変数の設定
AWS 上に構築済みの TwinMaker ワークスペースの ID と AWS リージョンを環境変数に設定します。
export AWS_REGION=us-east-1
export WORKSPACE_ID=CookieFactoryV3
pnpm のインストール
パッケージマネージャー pnpm をインストールします。
npm install -g pnpm
pnpm は本来であれば後続手順の assistant/install.sh
実行時にインストールされます(21 行目)が、私の環境では別途明示的にインストールする必要がありました。
依存関係のインストール
assistant
ディレクトリに移動し、install.sh
を実行します。これにより AI アシスタントに必要な依存関係がインストールされます。
cd <PROJECT_ROOT>/assistant
./install.sh
Pipenv 環境の起動
次のように Pipenv 環境を起動します。
pip install pipenv
pipenv --python 3
pipenv install
pipenv shell
これにより src/workspaces/cookiefactoryv3/assistant/Pipfile
で定義されている langchain などのモジュールにインストール可能とします。
Anthropic Claude のアクセス権の有効化
Amazon Bedrock の基盤モデルである Anthropic 社の Claude への us-east-1 でのアクセス権を有効化します。有効化をリクエストしてから有効化が完了するまで若干の時間を要します。
この Claude へのアクセスがローカルから LangChain 経由で行われます。
(2024/11/05 追記)ここでの基盤モデルの有効化操作は、本記事で行う後述の動作確認の範囲内においては必須ではありません。
AWS CLI の認証
AI Assitant Module が Amazon Bedrock にアクセスできるように、AWS CLI で認証を行います。
AI Assitant Module の起動
assistant/run.sh
を実行します。
./run.sh
すると http://localhost:8000/ で AI アシスタントのチャット UI が起動します。
ただしこの UI は利用しません。プロンプトで何かを入力しても次のようなエラーとなりますが、ここでは無視して構いません。(最終的には解決する必要があります)
Error raised by bedrock service: An error occurred (ExpiredTokenException) when calling the InvokeModel operation: The security token included in the request is expired
また、http://localhost:8000/ の画面は閉じても構いません。モジュール自体はバックグラウンドで引き続き起動します。
ダッシュボードの起動、AI アシスタントの確認
dashboard
ディレクトリに移動し、npm run dev
を実行してダッシュボードアプリケーションを起動します。
cd <PROJECT_ROOT>/dashboard
npm run dev
ダッシュボードでクッキー工場のデジタルツインが表示されたら、上部の[Run event simulation]をクリックします。
クッキーの形の異常が検出されたというイベントがシミュレーションされます。[Acknowledge]をクリックします。
Cookie Shape Anomaly Detected
Alarm rule: The number of deformed cookies exceeded 11 per 5 minutes.
すると AI アシスタントのチャット UI が開きます。[Run Issue Diagnosis]をクリックします。
問題の分析と原因の推測の結果が応答として表示されました。
Initial Diagnosis
Summary of the issue
An alarm triggered at 3:21 PM on Nov. 2nd, indicating an anomaly in cookie shape on the production line where more than 11 deformed cookies were produced within a 5 minute period.
Potential root causes
Issues with cookie dough extruder: Worn parts could be causing uneven dough flow resulting in misshapen cookies.
Problems with conveyor belt: An uneven or slipping conveyor belt could cause cookies to deform before entering the oven.
Oven temperature fluctuations: Inconsistent oven temperatures across belts/zones may result in uneven baking and cookie deformation.
Dough ingredient inconsistencies: Variations in dough ingredient ratios/qualities could impact the shape-retaining properties of the dough.
Improper dough mixing: Inadequate or too vigorous mixing could develop structural flaws in the dough affecting cookie shape.
The line operators may want to inspect the extruder, conveyor belt and oven conditions/recordings to identify potential issues causing the deformed cookies. It may also help to check dough ingredients and mixing processes. Resolving mechanical or process problems should help reduce deformed cookie counts.
応答の中の[Show in 3D]をクリックします。
すると左側の 3D ビュー内で原因となる箇所への自動フォーカスが行われます。この挙動はかっこいいですね。
注意点として、ここまでのチャットの返信は実際に AI アシスタントが生成 AI モデルを利用して生成したものではなく、チュートリアルで用意された定型文を返しているだけです。実際の生成 AI モデルを利用した動作確認は次回以降の記事で行う予定です。
トラブルシュート
./run.sh 実行時に ModuleNotFoundError が発生する
assistant/run.sh
実行時に次のような ModuleNotFoundError が発生する場合。
$ ./run.sh
$ Traceback (most recent call last):
File "/opt/homebrew/bin/chainlit", line 8, in <module>
sys.exit(cli())
^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/chainlit/cli/__init__.py", line 154, in chainlit_run
run_chainlit(target)
File "/opt/homebrew/lib/python3.11/site-packages/chainlit/cli/__init__.py", line 55, in run_chainlit
load_module(config.run.module_name)
File "/opt/homebrew/lib/python3.11/site-packages/chainlit/config.py", line 282, in load_module
spec.loader.exec_module(module)
File "<frozen importlib._bootstrap_external>", line 940, in exec_module
File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/bedrock.py", line 14, in <module>
import langchain
ModuleNotFoundError: No module named 'langchain'
Python モジュールのインストールが行われていないか、PATH が通っていない可能性があります。私の場合は「Pipenv 環境の起動」の対応で解決しました。
./run.sh 実行時に AccessDeniedException が発生する
assistant/run.sh
実行時に次のように ModuleNotFoundError が発生する場合。
$ ./run.sh
$ Traceback (most recent call last):
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/bin/chainlit", line 8, in <module>
sys.exit(cli())
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1157, in __call__
return self.main(*args, **kwargs)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1078, in main
rv = self.invoke(ctx)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1688, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 1434, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/click/core.py", line 783, in invoke
return __callback(*args, **kwargs)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/cli/__init__.py", line 153, in chainlit_run
run_chainlit(target)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/cli/__init__.py", line 47, in run_chainlit
load_module(config.run.module_name)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/chainlit/config.py", line 247, in load_module
spec.loader.exec_module(module)
File "<frozen importlib._bootstrap_external>", line 850, in exec_module
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "app/bedrock.py", line 21, in <module>
from lib.router import LLMRouterChain, MultiRouteChain, create_routes
File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/router.py", line 20, in <module>
from .tools.view import ViewChain
File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/tools/view.py", line 21, in <module>
from ..llm import get_bedrock_text, get_processed_prompt_template
File "/Users/wakatsuki.ryuta/projects/aws-samples/aws-iot-twinmaker-samples/src/workspaces/cookiefactoryv3/assistant/app/lib/llm.py", line 76, in <module>
response = bedrock.list_foundation_models()
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/botocore/client.py", line 535, in _api_call
return self._make_api_call(operation_name, kwargs)
File "/Users/wakatsuki.ryuta/.local/share/virtualenvs/assistant-DNaGx-nM/lib/python3.9/site-packages/botocore/client.py", line 980, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.errorfactory.AccessDeniedException: An error occurred (AccessDeniedException) when calling the ListFoundationModels operation: User: arn:aws:iam::XXXXXXXXXXXX:user/cm-wakatsuki.ryuta is not authorized to perform: bedrock:ListFoundationModels with an explicit deny in an identity-based policy
AWS CLI での認証が正常に行われていない可能性があります。私の場合は「AWS CLI の認証」の対応で解決しました。
チャット UI でのプロンプト入力時に AccessDeniedException が発生する
ダッシュボードアプリでのチャット UI でのプロンプト入力時に次のような AccessDeniedException が発生する場合。
Error raised by bedrock service: An error occurred (AccessDeniedException) when calling the InvokeModel operation: You don't have access to the model with the specified model ID.
Amazon Bedrock の基盤モデルである Anthropic Claude への us-east-1 でのアクセス権が有効化されていない可能性があります。私の場合は「Anthropic Claude のアクセス権の有効化」の対応で解決しました。
(2024/11/05 追記)ここでの基盤モデルの有効化操作は、本記事で行う後述の動作確認の範囲内においては必須ではありません。
おわりに
AWS IoT TwinMaker Samples のクッキー工場バージョン 3(CookieFactoryV3)を試してみたの「その3」として、AI アシスタント設定をしてみました。環境起因のトラブルに苦しめられましたが、なんとか AI アシスタントを動かせるところまで漕ぎ着けられました。
「デジタルツイン」と「生成 AI」という 2 つの技術トレンドを組み合わせたアプリケーションのデモを簡単に試せるのは熱いですね。ちなみに今回のデモは下記ブログで紹介されている通り、AWS re:Invent 2023 の Expo でデモ展示もされていました。
このようなソリューションが製造現場に導入されることにより、工場などのデジタルツインによる可視化と AI アシスタントによる自然言語での対話 UI が組み合わさることにより、熟練でない作業者でもより簡単に製造現場の状況の把握や問題への洞察が可能になり、製造業の生産性の向上につながるのではないでしょうか。
今回は最低限の動作確認を行っただけでしたが、次回は詳細な仕様について理解を行っていきたいと思います。
以上